/**
 * 管理员认证中间件
 * 验证请求是否来自已认证的管理员用户
 */

const jwt = require('../../utils/jwt');
const logger = require('../../logger');

/**
 * 管理员认证中间件函数
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 * @param {Function} next - Express next函数
 */
const adminAuthMiddleware = async (req, res, next) => {
    try {
        // 从请求头获取token
        const authHeader = req.headers.authorization;
        
        if (!authHeader || !authHeader.startsWith('Bearer ')) {
            return res.status(401).json({
                error: 'Unauthorized',
                message: '缺少有效的认证令牌'
            });
        }
        
        // 提取token
        const token = authHeader.split(' ')[1];
        
        // 验证token
        const decoded = jwt.verifyToken(token);
        
        // 检查用户是否为管理员
        if (!decoded.isAdmin || decoded.role !== 'admin') {
            return res.status(403).json({
                error: 'Forbidden',
                message: '只有管理员可以访问此资源'
            });
        }
        
        // 将用户信息添加到请求对象中
        req.user = decoded;
        
        logger.info(`管理员访问: ${decoded.username} 访问 ${req.path}`);
        
        next();
    } catch (error) {
        logger.error(`管理员认证失败: ${error.message}`);
        
        if (error.name === 'TokenExpiredError') {
            return res.status(401).json({
                error: 'TokenExpired',
                message: '认证令牌已过期'
            });
        }
        
        if (error.name === 'JsonWebTokenError') {
            return res.status(401).json({
                error: 'InvalidToken',
                message: '无效的认证令牌'
            });
        }
        
        return res.status(500).json({
            error: 'InternalServerError',
            message: '认证过程中发生错误'
        });
    }
};

module.exports = adminAuthMiddleware;